Skip to content

Conversation

@yronglin
Copy link
Contributor

@yronglin yronglin commented Jul 10, 2025

Refine basic.link.p3 tests with split-file.

@llvmbot llvmbot added the clang Clang issues not falling into any other category label Jul 10, 2025
@llvmbot
Copy link
Member

llvmbot commented Jul 10, 2025

@llvm/pr-subscribers-clang

Author: None (yronglin)

Changes

Refine basic.link.p3 tests with split-file and added more test for P2788R0 which was marked as implemented.


Full diff: https://github.com/llvm/llvm-project/pull/147945.diff

1 Files Affected:

  • (modified) clang/test/CXX/basic/basic.link/p3.cpp (+80-25)
diff --git a/clang/test/CXX/basic/basic.link/p3.cpp b/clang/test/CXX/basic/basic.link/p3.cpp
index 01202264d2591..22c298394c2a6 100644
--- a/clang/test/CXX/basic/basic.link/p3.cpp
+++ b/clang/test/CXX/basic/basic.link/p3.cpp
@@ -1,35 +1,23 @@
-// RUN: %clang_cc1 -std=c++2a -verify %s
-// RUN: %clang_cc1 -std=c++2a -verify %s -DIMPORT_ERROR=1
-// RUN: %clang_cc1 -std=c++2a -verify %s -DIMPORT_ERROR=2
+// RUN: rm -rf %t
+// RUN: split-file %s %t
 
+// RUN: %clang_cc1 -std=c++20 -verify %t/M.cppm
+// RUN: %clang_cc1 -std=c++20 -verify %t/ImportError1.cppm
+// RUN: %clang_cc1 -std=c++20 -verify %t/ImportError2.cppm
+// RUN: %clang_cc1 -std=c++20 -Wno-reserved-module-identifier -emit-module-interface %t/std.cppm -o %t/std.pcm
+// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/A.cppm -o %t/A.pcm
+// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/A-B.cppm -o %t/A-B.pcm
+// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify -fmodule-file=std=%t/std.pcm -fmodule-file=A=%t/A.pcm -fmodule-file=A:B=%t/A-B.pcm %t/A_impl.cppm
+// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify -fmodule-file=A=%t/A.pcm %t/User.cppm 
+
+//--- M.cppm
 module;
 
-#if IMPORT_ERROR != 2
 struct import { struct inner {}; };
-#endif
 struct module { struct inner {}; };
-
 constexpr int n = 123;
 
 export module m; // #1
-
-// Import errors are fatal, so we test them in isolation.
-#if IMPORT_ERROR == 1
-import x = {}; // expected-error {{expected ';' after module name}}
-               // expected-error@-1 {{module 'x' not found}}
-
-#elif IMPORT_ERROR == 2
-struct X;
-template<int> struct import;
-template<> struct import<n> {
-  static X y;
-};
-
-// This is not valid because the 'import <n>' is a pp-import, even though it
-// grammatically can't possibly be an import declaration.
-struct X {} import<n>::y; // expected-error {{'n' file not found}}
-
-#else
 module y = {}; // expected-error {{multiple module declarations}} expected-error 2{{}}
 // expected-note@#1 {{previous module declaration}}
 
@@ -51,4 +39,71 @@ template<typename T> module module_var_template;
 
 // This is a variable named 'import' that shadows the type 'import' above.
 struct X {} import;
-#endif
+
+//--- ImportError1.cppm
+module;
+
+struct import { struct inner {}; };
+struct module { struct inner {}; };
+
+constexpr int n = 123;
+
+export module m; // #1
+
+import x = {}; // expected-error {{expected ';' after module name}}
+               // expected-error@-1 {{module 'x' not found}}
+
+//--- ImportError2.cppm
+module;
+
+struct module { struct inner {}; };
+
+constexpr int n = 123;
+
+export module m; // #1
+
+struct X;
+template<int> struct import;
+template<> struct import<n> {
+  static X y;
+};
+
+// This is not valid because the 'import <n>' is a pp-import, even though it
+// grammatically can't possibly be an import declaration.
+struct X {} import<n>::y; // expected-error {{'n' file not found}}
+
+//--- A.cppm
+export module A;
+const double delta=0.01;
+export {
+  template<class F>
+  double derivative(F &&f,double x) {
+    return (f(x+delta)-f(x))/delta;
+  }
+}
+
+//--- std.cppm
+export module std;
+export using size_t = decltype(sizeof(void *));
+
+export namespace std {
+  template <typename T, size_t N>
+  struct array {};
+}
+
+//--- A-B.cppm
+module A:B;
+const int dimensions=3;
+
+//--- A_impl.cppm
+// expected-no-diagnostics
+module A;
+import std;
+import :B;
+
+using vector = std::array<double, dimensions>;  // error: lookup failed until P2788R0(Linkage for modular constants).
+
+//--- User.cppm
+// expected-no-diagnostics
+import A;
+double d=derivative([](double x) {return x*x;},2);  // error: names delta until P2788R0(Linkage for modular constants).

Signed-off-by: Wang, Yihan <[email protected]>
@yronglin yronglin changed the title [NFC][C++][Modules] Refine basic.link.p3 and add test for P2788R0 [NFC][C++][Modules] Refine test/CXX/basic.link/p3.cpp with split-file Jul 10, 2025
@yronglin yronglin merged commit d679b9a into llvm:main Jul 11, 2025
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clang Clang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants